package middleware

import (
	"niu-video/app/repository"
	"niu-video/pkg/jwt"
	"niu-video/pkg/response"
	"strings"

	"github.com/gin-gonic/gin"
)

func AuthJWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从标头 Authorization:Bearer xxxxx 中获取信息，并验证 JWT 的准确性
		claims, err := jwt.NewJWT().ParserToken(c)

		// JWT 解析失败，有错误发生
		if err != nil {
			if anonymous(c.Request.URL.String()) {
				c.Next()
				return
			}
			response.Unauthorized(err.Error(), c)
			c.Abort()
			return
		}

		// JWT 解析成功，设置用户信息
		userModel := repository.UserRepository.Get(claims.UserID)
		if userModel.UserID == 0 {
			response.Unauthorized("找不到对应用户，用户可能已删除", c)
			c.Abort()
			return
		}

		//将用户信息存入 gin.context 里，后续 auth 包将从这里拿到当前用户数据
		c.Set("current_user_id", userModel.UserID)
		c.Set("current_user_name", userModel.Username)
		c.Set("current_user", userModel)

		c.Next()
	}
}

// user_id 可需要，可不需要
func anonymous(url string) bool {
	// 定义可接受的URL列表
	acceptableUrls := []string{
		"/video/list",
		"/video/category",
		"/video/search",
		"/video/userWork",
		"/user/get",
	}
	// 判断URL是否在可接受的URL列表中
	for _, acceptableUrls := range acceptableUrls {
		if strings.Contains(url, acceptableUrls) {
			return true
		}
	}
	return false
}
